/**
 * 贷款计算器工具类
 * 提供贷款相关的计算功能
 */

/**
 * 计算等额本息还款的月供
 * @param {number} principal 贷款本金
 * @param {number} monthlyRate 月利率（百分比）
 * @param {number} months 贷款期限（月）
 * @returns {number} 月供金额
 */
export function calculateMonthlyPayment(principal, monthlyRate, months) {
  // 将百分比转换为小数
  const rate = monthlyRate / 100;
  
  // 如果利率为0，直接返回本金除以月数
  if (rate === 0) {
    return principal / months;
  }
  
  // 等额本息公式：月供 = 本金 × 月利率 × (1+月利率)^贷款月数 / [(1+月利率)^贷款月数 - 1]
  const temp = Math.pow(1 + rate, months);
  return principal * rate * temp / (temp - 1);
}

/**
 * 计算贷款总利息
 * @param {number} monthlyPayment 月供
 * @param {number} months 贷款期限（月）
 * @param {number} principal 贷款本金
 * @returns {number} 总利息
 */
export function calculateTotalInterest(monthlyPayment, months, principal) {
  return monthlyPayment * months - principal;
}

/**
 * 计算贷款总还款额
 * @param {number} monthlyPayment 月供
 * @param {number} months 贷款期限（月）
 * @returns {number} 总还款额
 */
export function calculateTotalPayment(monthlyPayment, months) {
  return monthlyPayment * months;
}

/**
 * 计算服务费
 * @param {number} principal 贷款本金
 * @param {number} dailyRate 日利率（百分比）
 * @param {number} days 计算天数，默认30天
 * @returns {number} 服务费
 */
export function calculateServiceFee(principal, dailyRate, days = 30) {
  return principal * (dailyRate / 100) * days;
}

/**
 * 生成还款计划
 * @param {number} principal 贷款本金
 * @param {number} monthlyRate 月利率（百分比）
 * @param {number} months 贷款期限（月）
 * @returns {Array} 还款计划数组
 */
export function generateRepaymentPlan(principal, monthlyRate, months) {
  const monthlyPayment = calculateMonthlyPayment(principal, monthlyRate, months);
  const plan = [];
  let remainingPrincipal = principal;
  
  for (let i = 1; i <= months; i++) {
    // 计算当月利息
    const interest = remainingPrincipal * (monthlyRate / 100);
    
    // 计算当月本金
    const monthlyPrincipal = monthlyPayment - interest;
    
    // 更新剩余本金
    remainingPrincipal -= monthlyPrincipal;
    
    // 处理最后一期可能的舍入误差
    if (i === months) {
      remainingPrincipal = 0;
    }
    
    // 添加到还款计划
    plan.push({
      period: i,
      payment: monthlyPayment,
      principal: monthlyPrincipal,
      interest: interest,
      remainingPrincipal: remainingPrincipal
    });
  }
  
  return plan;
}

/**
 * 格式化金额（添加千分位分隔符）
 * @param {number} amount 金额
 * @param {number} decimals 小数位数
 * @returns {string} 格式化后的金额字符串
 */
export function formatAmount(amount, decimals = 2) {
  return amount.toFixed(decimals)
    .replace(/\d(?=(\d{3})+\.)/g, '$&,');
}

/**
 * 解析格式化的金额字符串为数字
 * @param {string} formattedAmount 格式化的金额字符串
 * @returns {number} 数字金额
 */
export function parseAmount(formattedAmount) {
  return parseFloat(formattedAmount.replace(/,/g, ''));
}

/**
 * 日利率转换为月利率
 * @param {number} dailyRate 日利率（百分比）
 * @returns {number} 月利率（百分比）
 */
export function dailyRateToMonthlyRate(dailyRate) {
  return dailyRate * 30;
}

/**
 * 月利率转换为年利率
 * @param {number} monthlyRate 月利率（百分比）
 * @returns {number} 年利率（百分比）
 */
export function monthlyRateToAnnualRate(monthlyRate) {
  return monthlyRate * 12;
}

/**
 * 年利率转换为月利率
 * @param {number} annualRate 年利率（百分比）
 * @returns {number} 月利率（百分比）
 */
export function annualRateToMonthlyRate(annualRate) {
  return annualRate / 12;
}

/**
 * 月利率转换为日利率
 * @param {number} monthlyRate 月利率（百分比）
 * @returns {number} 日利率（百分比）
 */
export function monthlyRateToDailyRate(monthlyRate) {
  return monthlyRate / 30;
}